package chapter04.s04interface.example11;// 接口
// 接口：是 抽象方法的集合 ，包含类要实现的方法。
// 组成：全局常量和 抽象方法 、默认方法和静态方法

// 定义接口Animal
interface Animal {
    //全局常量
    //被隐式的指定为 public static final
    int ID = 1;
    String NAME = "牧羊犬";

    //抽象方法列表 -- 最常用的场景
    //接口中的方法会被隐式的指定为 public abstract
    void shout();

    void info();

    // Java 8 新增了接口的默认方法、 静态方法
    // 默认方法
    //简单说，默认方法就是接口可以有实现方法，而且不需要实现类去实现其方法。
    //我们只需在方法名前面加个 default 关键字即可实现默认方法。
    default void print() {
        System.out.println("我是一辆车!");
    }

    // 静态方法
    static int getID() {
        return Animal.ID;
    }
}

// 定义接口Action
interface Action {
    void eat();                    // 定义抽象方法eat()

    void bite();

    void sleep();

    void run();
}

// 一个类却可以实现多个接口
// 定义Dog类实现Animal接口和Action接口
class Dog implements Animal, Action {
    // 重写Action接口中的抽象方法eat()
    public void eat() {
        System.out.println("喜欢吃骨头");
    }

    @Override
    public void bite() {
        System.out.println("bite");
    }

    @Override
    public void sleep() {
        System.out.println("sleep");
    }

    @Override
    public void run() {
        System.out.println("run");
    }

    // 重写Animal接口中的抽象方法shout()
    public void shout() {
        System.out.println("汪汪...");
    }

    // 重写Animal接口中的抽象方法info()
    public void info() {
        System.out.println("名称：" + NAME);
    }
}

// 定义测试类
class Example11 {
    public static void main(String[] args) {
        // 使用Animal接口名直接访问了Animal接口中的静态方法getID()
        System.out.println("编号" + Animal.getID());

        Dog dog = new Dog();          // 创建Dog类的实例对象
        dog.info();
        dog.shout();                    // 调用Dog类中重写的shout()方法
        dog.eat();                        // 调用Dog类中重写的eat()方法
    }
}
